Exercícios sobre Notacação Assintótica

Resoluções por Ricardo Manhães Savii

Aluno do programa de Pós-Graduação em Ciência da Computação Universidade Federal de São Paulo

Justificativa de utilizar o Jupyter Notebook

Para utilizar suporte de gráficos.


In [1]:
import matplotlib.pyplot as plt
import numpy as np
""" statistical data visualization packages"""
import seaborn as sns

""" seaborn configurations """
sns.set_style('white')
sns.set_context('talk')
sns.set(font_scale=2)
plt.rcParams['figure.figsize'] = 20, 10

Alguns lembretes

  1. If $f(n) = o(g(n))$, then $\exists$ positive constants $c$, $n_0$, such that $0 \leq f(n) < c\cdot g(n)$, $\forall \;\; n \geq n_0$. - strict upper bound

  2. If $f(n) = O(g(n))$, then $\exists$ positive constants $c$, $n_0$, such that $0 \leq f(n) \leq c\cdot g(n)$, $\forall \;\; n \geq n_0$. upper bound

  3. If $f(n) = \Theta (g(n))$, then $\exists$ positive constants $c_1$, $c_2$, $n_0$, such that $0 \leq c_1\cdot g(n) \leq f(n) \leq c_2\cdot g(n)$, $\forall \;\; n \geq n_0$. upper and lower bound

  4. If $f(n) = \Omega(g(n))$, then $\exists$ positive constants $c$, $n_0$, such that $0 \leq c\cdot g(n) \leq f(n)$, $\forall \;\; n \geq n_0$. lower bound

  5. If $f(n) = \omega(g(n))$, then $\exists$ positive constants $c$, $n_0$, such that $0 \leq c\cdot g(n) < f(n)$, $\forall \;\; n \geq n_0$. strict lower bound

Thanks to Dra. Nina Amenta, her work available at http://web.cs.ucdavis.edu/~amenta/w04/dis1.pdf helped to develop this study.


Exercícios

1. prove que $n^2+10n+20$ $\in$ $O(n^2)$

$$\begin{array}{rl} f(n) = n^2 + 10n + 20 & = O(n^2)\\ n^2 + 10n + 20 & \leq c \cdot n^2\\ \dfrac{10}{n} + \dfrac{20}{n^2} & \leq c\\ \text{para $n=1$} \rightarrow\;\;\; 10 + 20 & \leq c\\ 30 & \leq c \end{array}$$

disto podemos concluir, para que à partir de $n_0 = 1$ tenhamos como limite superior de $n^2$ sobre $f(n)$, $c$ deve assumir o valor de $30$.

Podemos analisar isto no gráfico gerado abaixo:


In [2]:
def graph(formula, x_range):
    x = np.array(x_range)
    y = eval(formula)
    plt.plot(x,y, label=formula)

def generate(f, g, x1 = 3, x2 = 300):
    plt.subplot(211)
    r = np.linspace(0,x2,3001)
    graph(f, r)
    graph(g, r)
    plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,
               ncol=2, mode="expand", borderaxespad=0.)

    plt.subplot(223)
    r = np.linspace(0,x1,3001)
    graph(f, r)
    graph(g, r)

    plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
    plt.show()
    
c = 30
f = 'x**2 + 10*x + 20'
g = str(c)+'*x**2'
generate(f, g, x2 =15)


Vemos no gráfico acima como $30\cdot n^2$ domina $n^2+10n+20$ $\in$ $O(n^2)$. Lembrando que a visualização serve somente para auxiliar, a prova foi a matemática feita anterioremente.

Tendo $n_0 = 1$ e $c = 30$ fica comprovado que $n^2+10n+20$ $\in$ $O(n^2)$


2. prove que $300$ $\in$ $O(1)$.

$$\begin{array}{rl} f(n) = 300 & = O(1)\\ 300 & \leq c \cdot 1\\ 300 & \leq c\\ \end{array}$$

Logo, com $c = 300$ e $n_0 = 1$ garantimos que $300$ $\in$ $O(1)$.


3. prove que $\lceil n/3\rceil$ $\in$ $O(n)$.

$$\begin{array}{rl} f(n) = \lceil n/3 \rceil & = O(n)\\ \dfrac{\lceil n \rceil}{3} & \leq c \cdot n\\ \dfrac{ n + \theta}{3} & \leq c \cdot n \;\;\;\;\text{ onde $\theta$ $\in$ $[0,1)$ é uma quantia desconhecida.} \\ \dfrac{\theta}{3} & \leq c \;\;\;\;\text{ dividindo tudo por $n$} \\ \end{array}$$

Logo, sabendo que $\theta$ é uma quantia entre $0$ e $1$ e será dividido por $3$, então existe um $c$ inteiro positivo tal que $\lceil n/3 \rceil = O(n)$.

  • (a) É verdade que $n$ $\in$ $O(\lfloor n/3\rfloor)$?
$$\begin{array}{rl} f(n) = n & = O(\lfloor n/3 \rfloor)\\ n & \leq c \cdot \dfrac{\lfloor n \rfloor}{3}\\ n & \leq c \cdot \dfrac{ n - \theta}{3} \;\;\;\;\text{ onde $\theta$ $\in$ $[0,1)$ é uma quantia desconhecida.} \\ 1 & \leq c \dfrac{ - \theta}{3}\;\;\;\;\text{ dividindo tudo por $n$} \\ 3 & \leq - c\theta\\ -\dfrac{3}{\theta} & \leq c\\ \end{array}$$

Analisando o resultado, e sabendo que $\theta$ é uma quantia entre $0$ e $1$ que irá dividir $3$, então não existe um $c$ inteiro positivo tal que $n = O(\lfloor n/3 \rfloor)$. Logo, não é verdade que $n$ $\in$ $O(\lfloor n/3\rfloor)$.


4. prove que $\log n$ $\in$ $O(\log_{10} n)$.

Vou considerar que quando não há base discreta no $\log$ a sua base é 10.

$$\begin{array}{rl} f(n) = \log_10 n & = O(\log_{10} n)\\ \log_{10} n & \leq c \cdot \log_{10} n\\ \log_{10} n & \leq \log_{10} n^c\\ n & \leq n^c\\ 1 & \leq \dfrac{n^c}{n}\\ 1 & \leq n^{c-1} \end{array}$$

Aplicando $\lim\limits_{n\rightarrow\infty}$ obtemos:

$$\begin{array}{rl} \lim\limits_{n\rightarrow\infty} 1 & \leq \lim\limits_{n\rightarrow\infty} n^{c-1}\\ 1 & \leq \infty \;\; \text{(o que é verdade)}\\ \end{array}$$

Analisando o resultado, e sabendo que $n^c$ sempre será maior ou igual à $n$, é possível concluir que existe um $c$ inteiro positivo tal que $n\log_10 n = O(\log_{10} n)$. Por exemplo, $n = n_0 = 1$ e $c = 10$.

$$\begin{array}{rl} n & \leq n^c 1 & \leq 1^{10}\\ 1 & \leq 1\\ \end{array}$$

Logo, é verdade que $\log n$ $\in$ $O(\log_{10} n)$.


In [3]:
c = 10
f = 'np.log10(x)'
g = str(c) + '*np.log10(x)'

generate(f, g)


/home/ricoms/envs/AAED/lib/python3.5/site-packages/ipykernel/__main__.py:1: RuntimeWarning: divide by zero encountered in log10
  if __name__ == '__main__':

5. prove que $n$ $\in$ $O(2^n)$.

$$\begin{array}{rl} f(n) = n & = O(2^n)\\ n & \leq c \cdot 2^n\\ \dfrac{n}{c} & \leq 2^n\\ \log_2\left(\dfrac{n}{c}\right) & \leq n\\ \log_2n - \log_2c & \leq n\\ - \log_2c & \leq n - \log_2n\\ \log_2c & \geq \log_2(n) - n\\ c & \geq 2^{\log_2(n) - n}\\ 1 & \geq \dfrac{2^{\log_2(n) - n}}{c}\\ \end{array}$$

Aplicando $\lim\limits_{n\rightarrow\infty}$ obtemos:

$$\begin{array}{rl} \lim\limits_{n\rightarrow\infty} 1 & \geq \lim\limits_{n\rightarrow\infty} \dfrac{2^{\log_2(n) - n}}{c}\\ 1 & \geq \dfrac{2^{- \infty}}{c}\\ 1 & \geq 0 \;\; \text{(o que é verdade)}\\ \end{array}$$

Analisando o resultado, e sabendo que $\log_2(n) - n$ é um valor negativo, e, consequentemente, o resultado de $2^{\log_2(10) - 10}$ será um número entre $0$ e $1$. Por exemplo, se eu escolher $n = n_0 = 10$ teremos:

$$\begin{array}{rl} c & \geq 2^{\log_2(10) - 10}\\ c & \geq 2^{−6,678071905}\\ c & \geq 0,009765625 \end{array}$$

logo existe um $c$ inteiro positivo (exemplo, $c = 1$ para $n_0 = 10$) tal que $n = O(2^n)$. Logo, $n$ $\in$ $O(2^n)$.


In [4]:
c = 1
f = 'x'
g = str(c) + '*2**x'

generate(f, g, x2 = 15)



6. prove que $\log n$ $\in$ $O(n)$.

$$\begin{array}{rl} f(n) = \log n & = O(n)\\ \log n & \leq c \cdot n\\ n & \leq 10^{nc} \\ 1 & \leq \dfrac{10^{nc}}{n} \\ \end{array}$$

Aplicando $\lim\limits_{n\rightarrow\infty}$ obtemos:

$$\begin{array}{rl} \lim\limits_{n\rightarrow\infty} 1 & \leq \lim\limits_{n\rightarrow\infty} \dfrac{10^{cn}}{n}\\ 1 & \leq \lim\limits_{n\rightarrow\infty} \dfrac{c \cdot 10^{cn-1}}{1} \;\; \text{(utilizando l'hopital)}\\ 1 & \leq \infty \;\; \text{(o que é verdade)}\\ \end{array}$$

Analisando o resultado, e sabendo que $10^{nc}$ é um valor sempre maior que $n$. Por exemplo, se eu escolher $n = n_0 = 10$ e $c = 1$ teremos:

$$\begin{array}{rl} 10 & \leq 10^{10\cdot 1} \\ 10 & \leq 10000000000 \\ \end{array}$$

logo existe um $c$ inteiro positivo (exemplo, $c = 1$ para $n_0 = 10$) tal que $\log n = O(n)$. Logo, $\log n$ $\in$ $O(n)$.


In [5]:
c = 1
f = 'np.log10(x)'
g = str(c) + '*x'

generate(f, g, x2=50)


/home/ricoms/envs/AAED/lib/python3.5/site-packages/ipykernel/__main__.py:1: RuntimeWarning: divide by zero encountered in log10
  if __name__ == '__main__':

7. prove que $n/1000$ não é $O(1)$.

$$\begin{array}{rl} f(n) = n/1000 & = O(1)\\ n/1000 & \leq c \cdot 1\\ n & \leq 1000\cdot c \\ 1 & \leq \dfrac{1000\cdot c}{n} \\ \end{array}$$

Aplicando $\lim\limits_{n\rightarrow\infty}$ obtemos:

$$\begin{array}{rl} \lim\limits_{n\rightarrow\infty} 1 & \leq \lim\limits_{n\rightarrow\infty} \dfrac{ 1000\cdot c}{n}\\ 1 & \leq \dfrac{1000\cdot c}{\infty} \\ 1 & \leq 0\;\; \text{(o que é falso)}\\ \end{array}$$

Analisando o resultado, e sabendo que $10^{nc}$ é um valor sempre maior que $n$. Por exemplo, se eu escolher $n = n_0 = 10$ e $c = 1$ teremos:

$$\begin{array}{rl} 10 & \leq 10^{10\cdot 1} \\ 10 & \leq 10000000000 \\ \end{array}$$

logo não existe um $c$ inteiro positivo (exemplo, $c = 1$ para $n_0 = 10$) tal que $\log n = O(n)$. Logo, $\log n$ $\notin$ $O(n)$.


8. prove que $\dfrac{1}{2} n^2$ não é $O(n)$.

$$\begin{array}{rl} f(n) = \dfrac{1}{2} n^2 & = O(n)\\ \dfrac{1}{2} n^2 & \leq c \cdot n\\ \dfrac{1}{2} n & \leq c \\ \dfrac{1}{2} n & \leq c \\ n & \leq 2\cdot c \\ 1 & \leq \dfrac{2\cdot c}{n} \\ \end{array}$$

Aplicando $\lim\limits_{n\rightarrow\infty}$ obtemos:

$$\begin{array}{rl} \lim\limits_{n\rightarrow\infty} 1 & \leq \lim\limits_{n\rightarrow\infty} \dfrac{2\cdot c}{n}\\ 1 & \leq \dfrac{2\cdot c}{\infty} \\ 1 & \leq 0\;\; \text{(o que é falso)}\\ \end{array}$$

Analisando o resultado, definindo $c = 1$, obtemos que qualquer valor acima de $n = n_0 = 2$, a desigualdade $n \leq 2\cdot c$ se torna falsa . Por exemplo, se eu escolher $n = n_0 = 10$ e $c = 1$ teremos:

$$\begin{array}{rl} 10 & \leq 2\cdot 1 \\ 10 & \leq 2\;\; \text{(o que é falso)} \\ \end{array}$$

logo não existe um $c$ inteiro positivo (exemplo, $c = 1$ para $n_0 = 10$) tal que $\log n = O(n)$. Logo, $\log n$ $\notin$ $O(n)$.


In [6]:
c = 1
f = '0.5*x**2'
g = str(c) + '*x'

generate(f, g, x2 = 10)



9. suponha $T$ definida para $n = 0,1,...$

  • (a) Se $T(n)$ $\in$ $O(1)$, mostre que existe $c'$ tal que $T(n) \leq c'$ para todo $n \geq 0$.

?

$$\begin{array}{rl} T(n) & = O(1)\\ T(n) & \leq c' \cdot 1\\ T(n) & \leq c' \cdot 1\\ \end{array}$$
  • (b) Se $T(n)$ $\in$ $O(n)$, mostre que existe $c'$ tal que $T(n) \leq c'$ para todo $n \geq 1$.

?


10. prove que $n^2 + 999n + 9999$ $\in$ $O(n^2)$.

$$\begin{array}{rl} f(n) = n^2 + 999n + 9999 & = O(n^2)\\ n^2 + 999n + 9999 & \leq c \cdot n^2\\ 1 + \dfrac{999}{n} + \dfrac{9999}{n^2} & \leq c \\ 1 + \dfrac{999}{n} + \dfrac{9999}{n^2} & \leq c \\ \end{array}$$

Aplicando $\lim\limits_{n\rightarrow\infty}$ obtemos:

$$\begin{array}{rl} \lim\limits_{n\rightarrow\infty} \left(1 + \dfrac{999}{n} + \dfrac{9999}{n^2}\right) & \leq \lim\limits_{n\rightarrow\infty} c\\ 1 + \dfrac{999}{\infty} + \dfrac{9999}{\infty^2} & \leq c \\ 1 + 0 + 0 & \leq c\\ 1 & \leq c\;\; \text{(o que é verdadeiro para $c \geq 1$)}\\ \end{array}$$

Analisando o resultado, definindo $c = 876$, obtemos que qualquer valor acima de $n = n_0 = 4$, a desigualdade $n^2 + 999n + 9999 \leq c \cdot n^2$ se torna verdadeira . Por exemplo, se eu escolher $n = n_0 = 4$ e $c = 876$ teremos:

$$\begin{array}{rl} 1 + \dfrac{999}{n} + \dfrac{9999}{n^2} & \leq c \\ 1 + \dfrac{999}{4} + \dfrac{9999}{4^2} & \leq 876 \\ 875,6875& \leq 876 \\ \end{array}$$

logo existe um $c$ inteiro positivo (exemplo, $c = 876$ para $n_0 = 4$) tal que $n^2 + 999n + 9999 = O(n^2)$. Logo, $n^2 + 999n + 9999$ $\in$ $O(n^2)$.


In [7]:
c = 876
f = 'x**2 + 999*x + 9999'
g = str(c) + '*x**2'

generate(f, g, x1 = 10, x2 = 20)



11. prove que $\dfrac{1}{2}n(n+1)$ $\in$ $O(n^2)$.

$$\begin{array}{rl} f(n) = \dfrac{1}{2}n(n+1) & = O(n^2)\\ \dfrac{1}{2}n(n+1) & \leq c \cdot n^2\\ n(n+1) & \leq 2\cdot c \cdot n^2 \\ 1 + \dfrac{1}{n} & \leq 2\cdot c \\ \dfrac{1}{n} & \leq 2\cdot c - 1 \\ 1 & \leq (2\cdot c - 1)\cdot n \\ \end{array}$$

Aplicando $\lim\limits_{n\rightarrow\infty}$ obtemos:

$$\begin{array}{rl} \lim\limits_{n\rightarrow\infty} 1 & \leq \lim\limits_{n\rightarrow\infty} (2\cdot c - 1)\cdot n\\ 1 & \leq \infty \;\; \text{(o que é verdadeiro para $c \geq 1$)}\\ \end{array}$$

Analisando o resultado, definindo $c = 1$, obteremos $n$:

$$\begin{array}{rl} \dfrac{1}{n} & \leq 2\cdot c - 1 \\ \dfrac{1}{n} & \leq 2\cdot 1 - 1 \\ 1 & \leq n\cdot(2 - 1) \\ 1 & \leq n \\ \end{array}$$

logo existe um $n = n_0 = 1$ $c = 1$ tal que $\dfrac{1}{2}n(n+1) \leq c \cdot n^2$. Logo, $\dfrac{1}{2}n(n+1)$ $\in$ $O(n^2)$.


In [8]:
c = 1
f = '(1/2)*x*(x+1)'
g = str(c) + '*x**2'

generate(f, g)



12. é verdade que $\dfrac{1}{100}n^2 - 999n - 9999$ $\in$ $O(n)$? Justifique.

$$\begin{array}{rl} f(n) = \dfrac{1}{100}n^2 - 999n - 9999 & = O(n)\\ \dfrac{1}{100}n^2 - 999n - 9999 & \leq c \cdot n\\ \dfrac{1}{100}n - 999 - \dfrac{9999}{n} & \leq c \\ \end{array}$$

Aplicando $\lim\limits_{n\rightarrow\infty}$ obtemos:

$$\begin{array}{rl} \lim\limits_{n\rightarrow\infty} \left(\dfrac{1}{100}n - 999 - \dfrac{9999}{n}\right) & \leq \lim\limits_{n\rightarrow\infty} c\\ \dfrac{1}{100}\infty - 999 - \dfrac{9999}{\infty} & \leq c\\ \infty & \leq c \;\; \text{(o que é falso)}\\ \end{array}$$

Analisando o resultado, é impossível obter um valor de $c$. Logo não existe um $c$ para que exista $n = n_0$ tal que $\dfrac{1}{100}n^2 - 999n - 9999 \leq c \cdot n$.

Logo, $\dfrac{1}{100}n^2 - 999n - 9999$ $\notin$ $O(n)$.


In [9]:
c = 1000
f = '(1/100)*x**2 - 999*x - 9999'
g = str(c) + '*x'

generate(f, g, x2= 250000)



13. suponha que $f(n) = n^2$ quando $n$ é par e $f(n) = n^3$ quando $n$ é ímpar.

  • (a) é verdade que $f(n) = O(n^2)$?
  • (b) é verdade que $f(n) = O(n^3)$?
  • (c) é verdade que $n^2 = O(f(n))$?
  • (d) é verdade que $n^3 = O(f(n))$?

14. é verdade que $n^2 = O(2^n)$?

$$\begin{array}{rl} f(n) = n^2 & = O(2^n)\\ n^2 & \leq c \cdot 2^n\\ \dfrac{n^2}{c} & \leq 2^n\\ \log_2\left(\dfrac{n^2}{c}\right) &\leq n\\ \log_2n^2 - \log_2c &\leq n\\ \dfrac{\log_2n^2 - \log_2c}{n} &\leq 1\\ \end{array}$$

Aplicando $\lim\limits_{n\rightarrow\infty}$ obtemos:

$$\begin{array}{rl} \lim\limits_{n\rightarrow\infty} \dfrac{\log_2n^2 - \log_2c}{n} & \leq \lim\limits_{n\rightarrow\infty} 1\\ \dfrac{\log_2\infty^2 - \log_2c}{\infty} & \leq 1\\ 0 & \leq 1 \;\; \text{(o que é verdadeiro)}\\ \end{array}$$

Analisando o resultado, definindo $c = 1$, obteremos $n$:

$$\begin{array}{rl} \dfrac{\log_2n^2 - \log_2c}{n} &\leq 1\\ \dfrac{\log_2n^2 - \log_21}{n} &\leq 1\\ \dfrac{\log_2n^2 - 0}{n} &\leq 1\\ \dfrac{\log_2n^2}{n} &\leq 1\\ \log_2n^{2/n} &\leq 1\\ \log_22^{2/2} &\leq 1 \;\; \text{(substituindo $n = 2$)}\\ 1 &\leq 1\\ \end{array}$$

logo existe um $n = n_0 = 2$ e $c = 1$ tal que $n^2 \leq c \cdot 2^n$. Logo, $n^2 = O(2^n)$.


In [10]:
c = 1
f = 'x**2'
g = str(c) + '*2**x'

generate(f, g, x2 = 8)



15. é verdade que $\log n = O(\sqrt{n})$?

$$\begin{array}{rl} f(n) = \log n & = O(\sqrt{n})\\ \log n & \leq c \cdot n^{1/2}\\ \dfrac{\log n}{n^{1/2}} & \leq c \\ \end{array}$$

Aplicando $\lim\limits_{n\rightarrow\infty}$ obtemos:

$$\begin{array}{rl} \lim\limits_{n\rightarrow\infty} \dfrac{\log n}{n^{1/2}} & \leq \lim\limits_{n\rightarrow\infty} c\\ 0 & \leq c \;\; \text{(o que é verdade)}\\ \end{array}$$

Analisando o resultado, definindo $c = 1$ e $n = 1$, obteremos $n$:

$$\begin{array}{rl} \dfrac{\log_2n^2 - \log_2c}{n} &\leq 1\\ \dfrac{\log_21^2 - \log_21}{1} &\leq 1\\ 0 &\leq 1\\ \end{array}$$

logo existe um $n = n_0 = 1$ e $c = 1$ tal que $\log n \leq c \cdot n^{1/2}$. Logo, $\log n = O(\sqrt{n})$.


In [11]:
c = 1
f = 'np.log10(x)'
g = str(c) + '*np.sqrt(x)'

generate(f, g)


/home/ricoms/envs/AAED/lib/python3.5/site-packages/ipykernel/__main__.py:1: RuntimeWarning: divide by zero encountered in log10
  if __name__ == '__main__':

16. suponha $f(n) = 64n \log n$ e $g(n) = 8n^2$, com $n$ inteiro positivo.

Para que valores de $n$ temos $f(n) \leq g(n)$?

$$\begin{array}{rl} 64n\log n & \leq 8n^2\\ 8\log n & \leq n\\ \log n & \leq \dfrac{n}{8}\\ \dfrac{\log n}{n} & \leq \dfrac{1}{8}\\ \dfrac{\ln n}{n\ln(10)} & \leq \dfrac{1}{8}\\ \dfrac{\ln n}{n} & \leq \dfrac{1}{8}\ln(10)\\ n^{1/n} & \leq e^{\dfrac{1}{8}\ln(10)}\\ \end{array}$$

À partir deste ponto utilizarei a propriedade de W (Lambert W-Function) e o caso será tratado em dois casos, conforme abaixo:

$$\begin{array}{rl c rl} 0 < n & < \exp\left(-W\left(\dfrac{1}{8}\cdot(-\log(10))\right)\right) & \;\;\;\; & n & > \exp\left(-W_{-1}\left(\dfrac{1}{8}\cdot(-\log(10))\right)\right) \\ 0 < n & < 1,57231 & \;\;\;\; & n & > 6,5071 \\ \end{array}$$

Para auxiliar nos cálculos acima utilizei wolfram

Logo temos dois intervalos em que $f(n) \leq g(n)$ quando $0 < n < 1,57231$ e $n > 6,5071$, logo temos para $n$ inteiro e positivos, $n = 1$ e $n \geq 7$. Podemos confirmar esse duplo intervalo nos gráficos abaixo:


In [13]:
c = 8
f = '64*x*np.log10(x)'
g = str(c) + '*x**2'

generate(f, g, x2 = 10)


/home/ricoms/envs/AAED/lib/python3.5/site-packages/ipykernel/__main__.py:1: RuntimeWarning: divide by zero encountered in log10
  if __name__ == '__main__':
/home/ricoms/envs/AAED/lib/python3.5/site-packages/ipykernel/__main__.py:1: RuntimeWarning: invalid value encountered in multiply
  if __name__ == '__main__':

17. Suponha $T$ e $f$ definidas para $n = 1,2,...$ Mostre que se $T(n) = O(f(n))$ e $f(n) > 0$ para $n \geq 1$ então existe $c'$ tal que $T(n)) \leq c' f(n)$ para todo $n \geq 1$.


18. Faz sentido dizer "$T(n) = O(n^2)$ para $n \geq 3$"?


19. é verdade que $2^n = O(n)$?

  • (a) é verdade que $n = O(\log n)$?
  • (b) Justifique.

20. é verdade que $n + \sqrt{n}$ é $O(n)$?

  • (a) é verdade que $n$ é $O(\sqrt{n})$?
  • (b) é verdade que $n^{2/3}$ é $O(\sqrt{n})$?
  • (c) é verdade que $\sqrt{n} + 1000$ é $O(n)$?

21. é verdade que $\log n = O(n^{1/2})$?

  • (a) é verdade que $\sqrt{n} = O(\log n)$?

In [ ]:

  • (b) é verdade que $\log n = O(n^{1/3})$?

In [ ]:

  • (c) é verdade que $\log

22. é verdade que $\lceil \log n\rceil = O(\log n)$?


In [ ]:


23. interprete e prove a afirmação $O(n^2) + O(n^2) + O(n^2) = O(3n^2)$.


In [ ]:


24. interprete e prove a afirmação $nO(n) = O(n^2)$.


In [ ]:


25. interprete e prove a afirmação $)(3n^2 + 4n) = O(n^2)$.


In [ ]:


26. (Propiedade Transitiva)

  • Suponha $T(n) = O(f(n))$ e $f(n) = O(g(n))$. Mostre que $T(n) = O(g(n))$. Dê um exemplo interessante.

In [ ]:


27. (Regra da Soma, Caso Especial)

  • Suponha que $T(n) = O(f(n))$ e mostre que $T(n) + f(n) = O(f(n)))$. Dê um exemplo interessante.

In [ ]:


28. (Regra da Soma, Caso Geral)

  • Suponha que $T_1(n) = O(f_1(n))$ e $T_2 = O(f_2(n))$. Se $f_1(n) = O(f_2(n))$, mostre que $T_1(n) + T_2(n) = O(f_2(n))$.

In [ ]:


29. O que significa "$T(n) = n^2 + O(n)$"?

  • Mostre que se $T(n) = n^2 + O(n)$ então $T(n) = O(n^2)$.

In [ ]:


30. O que significa "$T(n) = nO(\log n)$"?

  • Mostre que $T(n) = nO(\log n)$ se, e somente se, $T(n) = O(n\log n)$.

In [ ]:


31. interprete e prove a afirmação $7\cdot O(n) = O(n)$.


In [ ]:


32. interprete e prove a afirmação $O(n) + O(n) = O(n)$.


In [ ]:


33. Prove que $O(n) = O(n^2)$. É verdade que $O(n^2) = O(n)$?


In [ ]:


34. interprete e prove a afirmação $(n+2)\cdot O(1) = O(n)$.


In [ ]:


35. interprete e prove a afirmação $\underbrace{O(1) + ... + O(1)}_\text{n+2} = O(n)$.


In [ ]:


36. Prove que $O(1) + O(1) + O(1) = O(1)$.

  • é verdade que $O(1) = O(1) + O(1) + O(1)$?

In [ ]:


37. interprete e prove a afirmação $O(f) + O(g) = O(f + g)$.


In [ ]:


38. prove que $n^2 + 10n + 20 = \Omega(n^2)$.

  • (a) prove que $n^2 - 10n - 20 = \Theta(n^2)$.

In [ ]:


39. prove que $n = \Omega(\log n)$.


In [ ]:


40. prove que $\log n = \Theta(\log_{10} n)$.


In [ ]:


41. prove que $0.0001n^3 - 100n^2 - 100n + 3 = \Theta(n^3)$.


In [ ]:


42. prove que $3n\log_{10}n+\log_{10}n^{10} = \Theta(n\log_{10}n)$.


In [ ]:


43. é verdade que $2^n = \Omega(3^n)$?


In [ ]:


44. é verdade que $2n^3 + 5\sqrt{n} = \Theta(n^3)$?


In [ ]:


45. prove que $f(n) = 1^2 + 2^2 + \cdots + n^2$ é igual $n^3/3 + O(n^2)$.


In [ ]:


46. prove que $\sum\limits_{i=1}^n \lceil \log i\rceil = \Theta(n\log n)$.


In [ ]:


47. Mostre que as seguintes relações são válidas usando a definição de constantes:

  • (a) $10^3n^2 + 10^6n$ $\in$ $\Theta(n^2)$;
  • (b) $11n^2 - 10^6n$ $\in$ $\Theta(n^2)$;
  • (c) $n$ $\in$ $o(n^{3/2})$;
  • (d) $n$ $\in$ $\omega(n^{9/10})$.

48. mostre que as seguintes relações são válidas:

  • (a) $n\log n$ $\in$ $\omega(n)$;

In [ ]:

  • (b) $\log^2 n$ $\in$ $o(n)$;

In [ ]:

  • (c) $\log^5 n$ $\in$ $o(n^{1/2})$;

In [ ]:

  • (d) $\log^d n$ $\in$ $o(n^\epsilon)$, onde $d \in \mathbb{N}^*$ e $0 < \epsilon < 1$;

In [ ]:

  • (e) $a_dn^d + a_{d-1}n^{d-1} + ... + a_1n + a_0$ $\in$ $\Theta(n^d)$, onde $d \in \mathbb{N}^*$ e $a_i$ é constante para todo $0 \leq i \leq d$;

In [ ]:

  • (f) $n^d$ $\in$ $o(2^n)$, onde $d$ $\in$ $\mathbb{N}^*$.

In [ ]:


49. Dadas duas funções positivas $f(n)$ e $g(n)$. Diz-se que $f(n) = \Theta(g(n))$ se $f(n) = O(g(n))$ e $g(n) = O(f(n))$. Mostre que $max( f(n), g(n)) = \Theta(f(n) + g(n))$.


In [ ]:


50. Indique para cada par de expressões $(A,B)$ na tabela abaixo, se $A$ é $O$, $o$, $\Omega$, $\omega$, ou $\Theta$ de $B$. Assuma que $k \geq 1$, $\epsilon > 0$ e $c > 1$ são constantes. Sua resposta deve ser de $SIM$ ou $NÃO$ acompanhada da justificativa.

\begin{array}{|c|cc|c|c|c|c|c|} \hline & A & B & O & o & \Theta & \omega & \Omega \\\hline (a) & \log^kn & n^\epsilon & SIM & SIM & & & \\ \hline (b) & n^k & c^n & SIM & SIM & & & \\ \hline (c) & \sqrt{n} & n^{\sin n} & & & & & \\ \hline (d) & 2^n & 2^{n/2} & & & SIM & SIM & \\ \hline (e) & n^{\log m} & m^{\log n} & SIM & & SIM & & SIM \\ \hline (f) & \log(n!) & \log(n^n) & SIM & & SIM & & SIM \\ \hline \end{array}

In [ ]:


51. Suponha que os algoritmos $A$ e $B$ só dependem de um parâmetro $n$. Suponha ainda que $A$ consome $S(n)$ unidades de tempo enquanto $B$ consome $T(n)$ unidades de tempo. Quero provar que o algoritmto $A$ é pelo menos tão eficiente quanto o algoritmo $B$ (no sentido assintótico).

Devo mostrar que existe $f(n)$ tal que:

  • $S(n) = O(f(n))$ e $T(n) = O(f(n))$?
  • $S(n) = O(f(n))$ e $T(n) = \Omega(f(n))$?
  • $S(n) = \Omega(f(n))$ e $T(n) = O(f(n))$?
  • $S(n) = \Omega(f(n))$ e $T(n) = \Omega(f(n))$?

Que devo fazer para mostrar que $A$ é mais eficiente que $B$?


In [ ]:


52. Demonstre as seguintes propriedades:

  • (a) Se $f(n)$ $\in$ $\Omega(g(n))$ e $g(n)$ $\in$ $\Omega(h(n))$, então $f(n)$ $\in$ $\Omega(h(n))$.

In [ ]:

  • (b) Se $f(n)$ $\in$ $O(g(n))$ e $g(n)$ $\in$ $O(h(n))$, então $f(n)$ $\in$ $O(h(n))$.

In [ ]:

  • (c) Se $f(n)$ $\in$ $\omega(g(n))$ e $g(n)$ $\in$ $\omega(h(n))$, então $f(n)$ $\in$ $\omega(h(n))$.

In [ ]:

  • (d) Se $f(n)$ $\in$ $o(g(n))$ e $g(n)$ $\in$ $o(h(n))$, então $f(n)$ $\in$ $o(h(n))$.

In [ ]:

  • (e) $f(n)$ $\in$ $\Theta(g(n))$ se, e somente se, $g(n)$ $\in$ $\Theta(f(n))$.

In [ ]:

  • (f) $f(n)$ $\in$ $O(g(n))$ se, e somente se, $g(n)$ $\in$ $\Omega(f(n))$.

In [ ]:

  • (g) Se $f(n)$ $\in$ $\Theta(g(n))$ e $g(n)$ $\in$ $O(h(n))$, então $h(n)$ $\in$ $\Omega(f(n))$.

In [ ]:

  • (h) Se $f(n)$ $\in$ $\Theta(g(n))$ e $g(n)$ $\in$ $\Omega(h(n))$, então $h(n)$ $\in$ $O(f(n))$.

In [ ]: